home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / dinit.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  5.7 KB  |  202 lines

  1.       subroutine dinit
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine performs storage-allocation and one-time computation
  5. c needed to do the small-signal distortion analysis.
  6. c
  7. c spice version 2g.6  sccsid=tabinf 3/15/83
  8.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  9.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  10.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  11.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  12.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  13.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  14.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  15.      7   irowno,jcolno,nttbr,nttar,lvntmp
  16. c spice version 2g.6  sccsid=cirdat 3/15/83
  17.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  18.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  19. c spice version 2g.6  sccsid=status 3/15/83
  20.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  21.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  22.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  23. c spice version 2g.6  sccsid=flags 3/15/83
  24.       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
  25.      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,itl6,igoof,nogo,keof
  26. c spice version 2g.6  sccsid=blank 3/15/83
  27.       common /blank/ value(200000)
  28.       integer nodplc(64)
  29.       complex cvalue(32)
  30.       equivalence (value(1),nodplc(1),cvalue(1))
  31. c
  32. c
  33.       call getm8(ld0,ndist)
  34.       call getm16(ld1,5*nstop)
  35. c
  36. c  bipolar junction transistors
  37. c
  38.       loc=locate(12)
  39.   100 if ((loc.eq.0).or.(nodplc(loc+36).ne.0)) go to 200
  40.       locv=nodplc(loc+1)
  41.       area=value(locv+1)
  42.       locm=nodplc(loc+8)
  43.       locm=nodplc(locm+1)
  44.       loct=lx0+nodplc(loc+22)
  45.       locd=ld0+nodplc(loc+23)
  46.       csat=value(locm+1)*area
  47.       ova=value(locm+4)
  48.       tf=value(locm+24)
  49.       tr=value(locm+33)
  50.       czbe=value(locm+21)*area
  51.       czbc=value(locm+29)*area
  52.       pe=value(locm+22)
  53.       xme=value(locm+23)
  54.       pc=value(locm+30)
  55.       xmc=value(locm+31)
  56.       fcpe=value(locm+46)
  57.       fcpc=value(locm+50)
  58.       vbe=value(loct)
  59.       vbc=value(loct+1)
  60.       gpi=value(loct+4)
  61.       go=value(loct+7)
  62.       gm=value(loct+6)
  63.       gmu=value(loct+5)
  64.       if (vbe.gt.0.0d0) go to 110
  65.       evbe=1.0d0
  66.       cbe=csat*vbe/vt
  67.       go to 120
  68.   110 evbe=dexp(vbe/vt)
  69.       cbe=csat*(evbe-1.0d0)
  70.   120 if (vbc.gt.0.0d0) go to 130
  71.       evbc=1.0d0
  72.       cbc=csat*vbc/vt
  73.       arg=1.0d0-vbc/pc
  74.       go to 140
  75.   130 evbc=dexp(vbc/vt)
  76.       cbc=csat*(evbc-1.0d0)
  77.   140 if (vbe.ge.fcpe) go to 150
  78.       arg=1.0d0-vbe/pe
  79.       sarg=dexp(xme*dlog(arg))
  80.       cjeo=czbe/sarg
  81.       argbe=pe-vbe
  82.       cje1=xme*cjeo/argbe
  83.       cje2=(1.0d0+xme)*cje1/argbe
  84.       go to 160
  85.   150 denom=dexp((1.0d0+xme)*dlog(1.0d0-fcpe))
  86.       cjeo=czbe*(1.0d0-fcpe*(1.0d0+xme)+xme*vbe/pe)/denom
  87.       cje1=czbe*xme/(denom*pe)
  88.       cje2=0.0d0
  89.   160 if (vbc.ge.fcpc) go to 170
  90.       arg=1.0d0-vbc/pc
  91.       sarg=dexp(xmc*dlog(arg))
  92.       cjco=czbc/sarg
  93.       argbc=pc-vbc
  94.       cjc1=xmc*cjco/argbc
  95.       cjc2=(1.0d0+xmc)*cjc1/argbc
  96.       go to 180
  97.   170 denom=dexp((1.0d0+xmc)*dlog(1.0d0-fcpc))
  98.       cjco=czbc*(1.0d0-fcpc*(1.0d0+xmc)+xmc*vbc/pc)/denom
  99.       cjc1=czbc*xmc/(denom*pc)
  100.       cjc2=0.0d0
  101.   180 twovt=vt+vt
  102.       go2=(-go+csat*(evbe+evbc)*ova)/twovt
  103.       gmo2=(cbe+csat)*ova/vt-2.0d0*go2
  104.       gm2=(gm+go)/twovt-gmo2-go2
  105.       gmu2=gmu/twovt
  106.       if (vbc.le.0.0d0) gmu2=0.0d0
  107.       gpi2=gpi/twovt
  108.       if (vbe.le.0.0d0) gpi2=0.0d0
  109.       cbo=tf*csat*evbe/vt
  110.       cbor=tr*csat*evbc/vt
  111.       cb1=cbo/vt
  112.       cb1r=cbor/vt
  113.       trivt=3.0d0*vt
  114.       go3=-(go2+(cbc+csat)*ova/twovt)/trivt
  115.       gmo23=-3.0d0*go3
  116.       gm2o3=-gmo23+(cbe+csat)*ova/(vt*twovt)
  117.       gm3=(gm2-(cbe-cbc)*ova/twovt)/trivt
  118.       gmu3=gmu2/trivt
  119.       gpi3=gpi2/trivt
  120.       cb2=cb1/twovt
  121.       cb2r=cb1r/twovt
  122.       value(locd)=cje1
  123.       value(locd+1)=cje2
  124.       value(locd+2)=cjc1
  125.       value(locd+3)=cjc2
  126.       value(locd+4)=go2
  127.       value(locd+5)=gmo2
  128.       value(locd+6)=gm2
  129.       value(locd+7)=gmu2
  130.       value(locd+8)=gpi2
  131.       value(locd+9)=cbo
  132.       value(locd+10)=cbor
  133.       value(locd+11)=cb1
  134.       value(locd+12)=cb1r
  135.       value(locd+13)=go3
  136.       value(locd+14)=gmo23
  137.       value(locd+15)=gm2o3
  138.       value(locd+16)=gm3
  139.       value(locd+17)=gmu3
  140.       value(locd+18)=gpi3
  141.       value(locd+19)=cb2
  142.       value(locd+20)=cb2r
  143.       loc=nodplc(loc)
  144.       go to 100
  145. c
  146. c  diodes
  147. c
  148.   200 loc=locate(11)
  149.   210 if ((loc.eq.0).or.(nodplc(loc+16).ne.0)) go to 300
  150.       locv=nodplc(loc+1)
  151.       area=value(locv+1)
  152.       locm=nodplc(loc+5)
  153.       locm=nodplc(locm+1)
  154.       loct=lx0+nodplc(loc+11)
  155.       locd=ld0+nodplc(loc+12)
  156.       csat=value(locm+1)*area
  157.       vte=value(locm+3)*vt
  158.       tau=value(locm+4)
  159.       czero=value(locm+5)*area
  160.       phib=value(locm+6)
  161.       xm=value(locm+7)
  162.       fcpb=value(locm+12)
  163.       vd=value(loct)
  164.       geq=value(loct+2)
  165.       evd=1.0d0
  166.       if (vd.ge.0.0d0) evd=dexp(vd/vte)
  167.       if (vd.ge.fcpb) go to 220
  168.       arg=1.0d0-vd/phib
  169.       sarg=dexp(xm*dlog(arg))
  170.       cdjo=czero/sarg
  171.       argd=phib-vd
  172.       cdj1=xm*cdjo/argd
  173.       cdj2=(1.0d0+xm)*cdj1/argd
  174.       go to 230
  175.   220 denom=dexp((1.0d0+xm)*dlog(1.0d0-fcpb))
  176.       cdjo=czero*(1.0d0-fcpb*(1.0d0+xm)+xm*vd/phib)/denom
  177.       cdj1=czero*xm/(denom*phib)
  178.       cdj2=0.0d0
  179.       cdj2=0.0d0
  180.   230 cdbo=tau*csat*evd/vte
  181.       cdb1=cdbo/vte
  182.       twovte=2.0d0*vte
  183.       geq2=geq/twovte
  184.       if (vd.le.0.0d0) geq2=0.0d0
  185.       trivte=3.0d0*vte
  186.       geq3=geq2/trivte
  187.       cdb2=cdb1/twovte
  188.       value(locd)=cdj1
  189.       value(locd+1)=cdj2
  190.       value(locd+2)=cdbo
  191.       value(locd+3)=cdb1
  192.       value(locd+4)=geq2
  193.       value(locd+5)=geq3
  194.       value(locd+6)=cdb2
  195.       loc=nodplc(loc)
  196.       go to 210
  197. c
  198. c  finished
  199. c
  200.   300 return
  201.       end
  202.